<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Funções de string úteis para diversos casos
 *
 * @package	CodeIgniter
 * @subpackage	Helpers
 * @category	Helpers
 * @author	Douglas Rafael
 */

// ------------------------------------------------------------------------

/**
 * Remove acentos e caracteres especiais
 * - Remove espaço em branco substituindo pelo separador caso seja passado como parametro 
 * 
 * @param string $string    String a ser formatada
 * @param string $separator Separador a ser utilizado para preencher espaços em brancos. Caso deseje manter os espaços em brancos não passe nada como parametro
 * @return string String formatada
 */
if (!function_exists('remove_accents')) {
    
    function remove_accents($string, $separator = NULL) {
        setlocale(LC_ALL, 'pt_BR.utf-8');

        $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
        $clean = trim($clean);
        $clean = preg_replace("/[^a-zA-Z0-9\/_| -]/", '', $clean);
        if (!empty($separator)) {
            $clean = strtolower(trim($clean, $separator));
            $clean = preg_replace("/[\/_| -]+/", $separator, $clean);
        }
        return strtolower($clean);
    }

}

/**
 * Corta a string/Renomeia para um tamanho limite de caracteres
 *  - Acrescenta um número randomico md5 nod totoal de 6 caracteres ao final da string depois de _
 * 
 * @param string $string String a ser cortada/renomeada
 * @param int    $length Tamanho final da string
 * @param boolean $radon TRUE para acrescentar no final da string um numero radomico | FALSE para nao
 * @return string
 */
if (!function_exists('crop_string')) {

    function crop_string($string, $length, $radon = FALSE) {
        $string = substr($string, 0, $length);
        if ($radon) {
            $string = $string . '_' . substr(md5(uniqid(rand(), true)), 0, 6);
        }
        return $string;
    }

}

/**
 * Acrescenta string da esquerda para direita ou direita para esquerda.
 * Exemplo de Uso:
 * - string_fill(9, 0, 5); Acrescenta zero a esquerda do número 9
 * - Retono: 00009
 *  
 * @param string $str               String a ser formatada
 * @param int    $total_length      Total de Vezes que o $fil será repetido. Contando com os caracteres da string $str
 * @param string $fill              Valor a ser colocado na string
 * @param bool   $left              Direção LEFT (esquerda) em que o $fill será colocado. Se FALSE a direção será RIGHT (direita)
 * @return string String formatada
 */
if (!function_exists('string_fill')) {

    function string_fill($str, $total_length, $fill, $left = TRUE) {
        return str_pad($str, $total_length, $fill, $left ? STR_PAD_LEFT : STR_PAD_RIGHT);
    }

}


/**
 * Formata data brasileira no formato XX/XX/XXXX para formato americano XXXX/XX/XX, formato para salvar no banco
 * Ou Formata o inverso, formato americano para o brasileiro
 * 
 * @param string $data            Data a ser formatada
 * @param bool   $data_time       Se a data é datatime
 * @param bool   $current_time    Define se a data vai ser com o horario atual
 * @return string
 */
if (!function_exists('format_date')) {
    
    function format_date($data, $data_time = TRUE, $current_time = FALSE) {
        // Formata para o padrão Brasileiro
        if (strpos($data, '-') && strpos($data, ':') === FALSE) {
            $data_formatada = implode('/', array_reverse(explode('-', $data)));
        }
        // Formata para o padrão Americano
        else if (strpos($data, '/')) {
            $data_formatada = implode('-', array_reverse(explode('/', $data)));
            if ($current_time)
                $data_formatada = $data_formatada . ' ' . date('H:i:s');
        }
        // Formata para o padrão brasileiro com hora
        else if (strpos($data, '-') && strpos($data, ':')) {
            $data_formatada = date('d/m/Y \à\s H:i', strtotime($data));
            if (!$data_time) // formata sem hora
                $data_formatada = date('d/m/Y', strtotime($data));
        } else {
            throw new Exception('Não foi possivel formatar a data pois não possui um formato válido. XX/XX/XXXX');
        }

        return $data_formatada;
    }
    
}


if (!function_exists('date_american')) {
    
    /**
     * Formata a data para o padrão americano com hora ou sem
     * 
     * @param  string $data         Data a ser formatada
     * @param  string $data_time    Se vai retonar com time
     * @return string               Retorna a data formatada
     * @throws Exception
     */
    function date_american($data, $data_time = FALSE) {
        // Formata para o padrão americano/ para americano sem hora ou brasileiro para americano
        if (strpos($data, '-') || strpos($data, '/') || strpos($data, ':')) {
            $data_formatada = date('Y-m-d', strtotime($data));
            if ($data_time) // formata sem hora
                $data_formatada = date('Y-m-d H:i:s', strtotime($data));
        } else {
            throw new Exception('Não foi possivel formatar a data pois não possui um formato válido. XX/XX/XXXX');
        }

        return $data_formatada;
    }
}
    

/**
 * Tranforma data em modo extenso
 * 
 * @param string $data
 * @return string
 */
if (!function_exists('data_to_string')) {

    function data_to_string($data) {
        setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese");
        return utf8_encode(strftime("%A, dia %d de %B de %Y", strtotime($data)));
    }

}


/**
 * Retorna a diferença entre duas datas.
 *  - Diferença de Ano. mês, dia, hora e minuto de acordo com o valor do parametro $type
 * 
 * @param datetime $data_inicial
 * @param datetime $data_final
 * @param string   $type Tipo do dado a retornar podendo ser: Y, m, d, h, ou i.
 *                   - Caso seja passado um valor errado ou não passado será retornado a seguinte string: XX anos, XX meses e XX dias
 * @return string
 */
if (!function_exists('diff_date')) {

    function diff_date($data_inicial, $data_final, $type = NULL) {
        $datetime_init = new DateTime($data_inicial);
        $datetime_end = new DateTime($data_final);
        $interval = $datetime_init->diff($datetime_end);

        switch ($type) {
            case 'Y': // ANO
                $data = $interval->format('%Y');
                break;
            case 'm': // MES
                $data = string_fill($interval->format('%m'), 2, 0);
                break;
            case 'd': // DIA
                $data = string_fill($interval->format('%a'), 2, 0);
                break;
            case 'h': // HORA
                $data = $interval->format('%h');
                break;
            case 'i': // MINUTO
                $data = string_fill(($interval->format('%d') * 1440), 2, 0);
                break;
            default: // STRING com ANO + DIAS 
                // Preparando string do ANO
                if($interval->format('%Y') == 0){
                    $ano = NULL;
                }else if($interval->format('%Y') > 1){
                    $ano = $interval->format('%Y') . ' anos';
                }else{
                    $ano = $interval->format('%Y') . ' ano';
                }
                
                // Preparando string do MES
                if($interval->format('%m') == 0){
                    $mes = NULL;
                }else if($interval->format('%m') > 1){
                    $mes = string_fill($interval->format('%m'), 2, 0) . ' meses';
                    $mes = $ano != '' ? ', '. $mes : $mes; 
                }else{
                    $mes = string_fill($interval->format('%m'), 2, 0) . ' mês';
                    $mes = $ano != '' ? ', '. $mes : $mes; 
                }
                
                // Preparando string do DIAS
                if($interval->format('%d') == 0){
                    $dia = NULL;
                }else if($interval->format('%d') > 1){
                    $dia = string_fill($interval->format('%d'), 2, 0) . ' dias';
                    $dia = $mes != '' ? ' e '. $dia : $dia; 
                }else{
                    $dia = string_fill($interval->format('%d'), 2, 0) . ' dia';
                    $dia = $mes != '' ? ' e '. $dia : $dia;
                }
                
                $data = $ano . $mes . $dia;
                break;
        }
        
        return $data;
    }
}  



/**
 * Função para gerar senhas aleatórias
 *
 * @author Thiago Belem <contato@thiagobelem.net>
 *
 * @param integer $tamanho Tamanho da senha a ser gerada
 * @param boolean $maiusculas Se terá letras maiúsculas
 * @param boolean $numeros Se terá números
 * @param boolean $simbolos Se terá símbolos
 *
 * @return string A senha gerada
 */
if (!function_exists('generate_password')) {
    
    function generate_password($tamanho = 8, $maiusculas = TRUE, $numeros = TRUE, $simbolos = FALSE) {
        $lmin = 'abcdefghijklmnopqrstuvwxyz';
        $lmai = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $num = '1234567890';
        $simb = '!@#$%*-';
        $retorno = '';
        $caracteres = '';

        $caracteres .= $lmin;
        if ($maiusculas)
            $caracteres .= $lmai;
        if ($numeros)
            $caracteres .= $num;
        if ($simbolos)
            $caracteres .= $simb;

        $len = strlen($caracteres);
        for ($n = 1; $n <= $tamanho; $n++) {
            $rand = mt_rand(1, $len);
            $retorno .= $caracteres[$rand - 1];
        }
        return $retorno;
    }
}


/**
 * Retorna nome de autor formatado de acordo com as normas da ABNT
 * - O sobrenome vem primeiro, em seguida separado por vírgula vem o primeiro nome
 *
 * @author Douglas Rafael <douglasrafaelcg@gmail.com>
 *
 * @param  string $name  String a ser formatada
 * @return string        Nome do autor formatado
 */
if (!function_exists('format_name_author')) {
    
    function format_name_author($name) {
        return strstr($name, " ", FALSE) . ', ' . strstr($name, " ", TRUE); 
    }
}
// A partir do PHP 5.3.0
/* End of file string_util.php */
/* Location: application/helpers/string_util.php */